﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;

//namespace SuperJ.CMS.Repositories
//{
//public static class LinqExtent
//    {
//        public static List<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query,
//                                                                      Expression<Func<TEntity, bool>> where,
//                                                                      Expression<Func<TEntity, TOrderBy>> orderby,
//                                                                      Expression<Func<TEntity, int, TResult>> selector,
//                                                                      bool isAsc)
//        {
//            if (selector == null)
//            {
//                thrownewArgumentNullException("selector");
//            }
 
//            var queryable = query;
//            if (where != null)
//            {
//                queryable = queryable.Where(where);
//            }
//            if (orderby != null)
//            {
//                queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
//            }
 
//            return queryable.Select(selector).ToList();
//        }
 
//        publicstaticList<object> Query<TEntity, TOrderBy>(this.IQueryable<TEntity> query,
//                                                                      Expression<Func<TEntity, bool>> where,
//                                                                      Expression<Func<TEntity, TOrderBy>> orderby,
//                                                                      Func<IQueryable<TEntity>, List<object>> selector,
//                                                                      bool isAsc)
//        {
//            if (selector == null)
//            {
//                thrownewArgumentNullException("selector");
//            }
 
//            var queryable = query;
//            if (where != null)
//            {
//                queryable = queryable.Where(where);
//            }
//            if (orderby != null)
//            {
//                queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
//            }
 
//            return selector(queryable);
//        }
 
//        publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
//                                                                Expression<Func<TEntity, bool>> where,
//                                                                Expression<Func<TEntity, TOrderBy>> orderby,
//                                                                Func<IQueryable<TEntity>, List<object>> selector,
//                                                                bool isAsc)
//        {
//            return Query(query, index, pageSize, newList<Expression<Func<TEntity, bool>>> {where}, orderby, selector,
//                         isAsc);
//        }
//        publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
//                                                         List<Expression<Func<TEntity, bool>>> wheres,
//                                                         Expression<Func<TEntity, TOrderBy>> orderby,
//                                                         Func<IQueryable<TEntity>, List<object>> selector, bool isAsc)
//        {
//            //if (selector == null)
//            //{
//            //    throw new ArgumentNullException("selector");
//            //}
 
//            //PageInfo.CheckPageIndexAndSize(ref index,ref pageSize);
//            //IQueryable<TEntity> queryable = query;
//            //if (wheres != null)
//            //{
//            //    wheres.ForEach(p=>queryable = queryable.Where(p));
//            //}
 
//            //int count = query.Count();
//            //PageInfo.CheckPageIndexAndSize(ref index,pageSize,count);
//            //if (count > 0)
//            //{
//            //    if (orderby != null)
//            //    {
//            //        queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
 
//            //    }
 
//            //    return new PageInfo<object>(index,pageSize,count,selector(queryable));
//            //}
 
//            //return new PageInfo<object>(index,pageSize,count,new List<object>());
 
//            return Query<TEntity, TOrderBy, object>(query, index, pageSize, wheres, orderby, selector, isAsc);
//        }
 
//        publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
//                                                         List<Expression<Func<TEntity, bool>>> wheres,
//                                                         Expression<Func<TEntity, TOrderBy>> orderby,
//                                                         Func<IQueryable<TEntity>, List<TResult>> selector, bool isAsc)
//        {
//            if (selector == null)
//            {
//                thrownewArgumentNullException("selector");
//            }
 
//            PageInfo.CheckPageIndexAndSize(ref index, ref pageSize);
//            IQueryable<TEntity> queryable = query;
//            if (wheres != null)
//            {
//                wheres.ForEach(p => queryable = queryable.Where(p));
//            }
 
//            int count = query.Count();
//            PageInfo.CheckPageIndexAndSize(ref index, pageSize, count);
//            if (count > 0)
//            {
//                if (orderby != null)
//                {
//                    queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
 
//                }
 
//                returnnewPageInfo<TResult>(index, pageSize, count, selector(queryable));
//            }
 
//            returnnewPageInfo<TResult>(index, pageSize, count, newList<TResult>());
//        }
 
//        publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
//                                                                Expression<Func<TEntity, bool>> where,
//                                                                Expression<Func<TEntity, TOrderBy>> orderby,
//                                                                Func<IQueryable<TEntity>, List<TResult>> selector,
//                                                                bool isAsc)
//        {
//            return Query(query, index, pageSize, newList<Expression<Func<TEntity, bool>>> { where }, orderby, selector,
//                         isAsc);
//        }
//    }
//}

//publicclassPageInfo
//    {
//        publicstaticvoid CheckPageIndexAndSize(refint index, refint size)
//        {
//            if (index < 1)
//            {
//                index = 1;
//            }
 
//            if (size < 1)
//            {
//                size = 20;
//            }
//        }
 
//        publicstaticvoid CheckPageIndexAndSize(refint index, int size, int count)
//        {
//            if (count >= index * size)
//            {
//                return;
//            }
 
//            index = count / size;
//            if (count % size > 0)
//            {
//                index++;
//            }
 
//            if (index == 0)
//            {
//                index = 1;
//            }
//        }
 
//    }
 
//    publicclassPageInfo<T> : PageInfo
//    {
//        internal PageInfo()
//        {
//            DataList = newList<T>();
//        }
//        public PageInfo(int index, int pageSize, int count, List<T> dataList)
//        {
//            Index = index;
//            PageSie = pageSize;
//            Count = count;
//            DataList = dataList;
//        }
 
//        publicint Index { get; privateset; }
//        publicint PageSie { get; privateset; }
//        publicint Count { get; privateset; }
//        publicList<T> DataList { get; privateset; }
 
//        publicPageInfo<T> Empty
//        {
//            get { returnnewPageInfo<T>(); }
//        }
//    }